import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import pearsonr
import seaborn as sns

# 设置 seaborn 样式
sns.set_theme(style="whitegrid")

# 设置字体为黑体，解决中文显示问题
plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置字体为黑体
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

# ====================== 1. 数据加载（仅共同年份） ======================
# 表3.1 上海市生产总值（仅选取共同年份）
gdp_data = {
    "Year": [2015, 2020, 2022, 2023],
    "GDP": [26887.02, 38963.30, 44809.13, 47218.66],  # 单位：亿元
    "Tertiary": [18352.84, 28597.05, 33301.99, 35509.60]  # 第三产业增加值
}
df_gdp = pd.DataFrame(gdp_data)
df_gdp["Tertiary_Ratio"] = df_gdp["Tertiary"] / df_gdp["GDP"] * 100  # 计算三产占比（%）

# 表5.17 环境空气数据（仅共同年份）
env_data = {
    "Year": [2015, 2020, 2022, 2023],
    "PM2_5": [53, 32, 25, 28],  # 单位：μg/m³
    "Air_Quality_Rate": [85.2, 87.2, 87.1, 87.7]  # 空气质量优良率（%）
}
df_env = pd.DataFrame(env_data)

# 表9.1 居民家庭数据（仅共同年份）
resident_data = {
    "Year": [2015, 2020, 2022, 2023],
    "Income": [49867, 72232, 79610, 84834],  # 人均可支配收入（元）
    "Expenditure": [34784, 42536, 46045, 52508]  # 人均消费支出（元）
}
df_resident = pd.DataFrame(resident_data)

# 合并数据（inner join确保只保留共同年份）
df = pd.merge(df_gdp, df_env, on="Year", how="inner")
df = pd.merge(df, df_resident, on="Year", how="inner")

# 计算人均GDP（假设常住人口2500万）
df["GDP_per_capita"] = df["GDP"] * 1e8 / 2.5e7  # 单位：元

# ====================== 2. 评价模型构建 ======================
# 定义指标权重（AHP法）
weights = {
    "GDP_per_capita": 0.35,
    "Tertiary_Ratio": 0.25,
    "Inverse_PM2_5": 0.15,  # PM2.5为逆指标
    "Air_Quality_Rate": 0.10,
    "Income": 0.10,
    "Expenditure": 0.05
}

# 数据标准化
def normalize(x, is_negative=False):
    if is_negative:
        x = 1 / x  # 对逆指标取倒数
    return (x - x.min()) / (x.max() - x.min())

df_normalized = pd.DataFrame()
df_normalized["GDP_per_capita"] = normalize(df["GDP_per_capita"])
df_normalized["Tertiary_Ratio"] = normalize(df["Tertiary_Ratio"])
df_normalized["Inverse_PM2_5"] = normalize(df["PM2_5"], is_negative=True)
df_normalized["Air_Quality_Rate"] = normalize(df["Air_Quality_Rate"])
df_normalized["Income"] = normalize(df["Income"])
df_normalized["Expenditure"] = normalize(df["Expenditure"])

# 计算康养指数（KCI）
df["KCI"] = (df_normalized["GDP_per_capita"] * weights["GDP_per_capita"] +
             df_normalized["Tertiary_Ratio"] * weights["Tertiary_Ratio"] +
             df_normalized["Inverse_PM2_5"] * weights["Inverse_PM2_5"] +
             df_normalized["Air_Quality_Rate"] * weights["Air_Quality_Rate"] +
             df_normalized["Income"] * weights["Income"] +
             df_normalized["Expenditure"] * weights["Expenditure"])

# ====================== 3. 结果可视化 ======================
plt.figure(figsize=(14, 10))

# (1) 康养指数趋势
plt.subplot(2, 2, 1)
plt.plot(df["Year"], df["KCI"], marker='o', linestyle='--', color='#2E86C1', linewidth=2)
plt.title("上海市康养指数变化趋势（2015-2023）", fontsize=12, pad=20)
plt.xlabel("年份", fontsize=10)
plt.ylabel("康养指数（标准化分值）", fontsize=10)
plt.xticks(df["Year"])
plt.grid(axis='y', linestyle='--', alpha=0.7)
# 添加数值标签
for x, y in zip(df["Year"], df["KCI"]):
    plt.text(x, y+0.02, f"{y:.3f}", ha='center', va='bottom', fontsize=9)

# (2) 指标权重分布
plt.subplot(2, 2, 2)
wedges, texts, autotexts = plt.pie(
    weights.values(),
    labels=[f"{k}\n({v*100:.1f}%)" for k, v in weights.items()],
    autopct="%.1f%%",
    startangle=90,
    colors=['#3498DB','#2ECC71','#E74C3C','#F39C12','#9B59B6','#34495E'],
    textprops={'fontsize': 8}
)
plt.title("评价指标权重分配", fontsize=12, pad=20)

# (3) 环境与经济指标对比
plt.subplot(2, 2, 3)
ax1 = plt.gca()
ax2 = ax1.twinx()
ax1.plot(df["Year"], df["PM2_5"], color='#E74C3C', marker='s', label="PM2.5浓度")
ax2.plot(df["Year"], df["Tertiary_Ratio"], color='#28B463', marker='^', linestyle='--', label="第三产业占比")
ax1.set_xlabel("年份", fontsize=10)
ax1.set_ylabel("PM2.5浓度（μg/m³）", color='#E74C3C', fontsize=10)
ax2.set_ylabel("第三产业占比（%）", color='#28B463', fontsize=10)
ax1.set_xticks(df["Year"])
ax1.grid(axis='y', linestyle='--', alpha=0.7)
# 合并图例
lines1, labels1 = ax1.get_legend_handles_labels()
lines2, labels2 = ax2.get_legend_handles_labels()
ax1.legend(lines1 + lines2, labels1 + labels2, loc="upper right", fontsize=8)

# (4) 居民收支增长
plt.subplot(2, 2, 4)
plt.plot(df["Year"], df["Income"]/1e4, marker='o', label="人均可支配收入（万元）")
plt.plot(df["Year"], df["Expenditure"]/1e4, marker='s', label="人均消费支出（万元）")
plt.xlabel("年份", fontsize=10)
plt.ylabel("金额（万元）", fontsize=10)
plt.xticks(df["Year"])
plt.legend(fontsize=8)
plt.grid(axis='y', linestyle='--', alpha=0.7)

plt.tight_layout()
plt.savefig("康养城市综合评价（严格年份匹配）.png", dpi=300, bbox_inches='tight')
plt.show()

# ====================== 4. 结果分析 ======================
print("=== 康养指数计算结果 ===")
print(df[["Year", "KCI"]].sort_values("KCI", ascending=False))
